package com.estore.service;
import com.estore.model.Product;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

/**
 * 商品服务类（新增数据备份功能）
 */
public class ProductService {
    // 原有属性（productData、dataFilePath、backupFilePath）保持不变

    // 原有方法（构造函数、loadConfig、initDefaultProducts、saveData、loadData）保持不变

    /**
     * 数据备份：使用字节流+缓冲区，将源文件复制到备份文件
     * @return 备份成功返回true，失败返回false
     */
    public boolean backupData() {
        // 先检查源文件是否存在
        java.io.File sourceFile = new java.io.File(dataFilePath);
        if (!sourceFile.exists()) {
            System.err.println("备份失败：源数据文件不存在！");
            return false;
        }

        // 缓冲区大小：1024字节（1KB），平衡性能与内存占用
        byte[] buffer = new byte[1024];
        int readLen; // 每次实际读取的字节数

        try (// 源文件输入流（读）
             FileInputStream fis = new FileInputStream(sourceFile);
             // 备份文件输出流（写）：若文件已存在，会覆盖
             FileOutputStream fos = new FileOutputStream(backupFilePath)) {

            System.out.println("开始备份数据... 源文件：" + dataFilePath + "，备份文件：" + backupFilePath);
            // 循环读取：每次读1024字节到缓冲区，直到读取完毕（readLen=-1）
            while ((readLen = fis.read(buffer)) != -1) {
                // 写入缓冲区中的有效数据（避免写入多余的空字节）
                fos.write(buffer, 0, readLen);
            }
            // 强制刷新缓冲区，确保数据全部写入文件
            fos.flush();
            System.out.println("数据备份成功！备份文件大小：" + new java.io.File(backupFilePath).length() + " 字节");
            return true;
        } catch (IOException e) {
            System.err.println("备份数据失败！错误信息：" + e.getMessage());
            return false;
        }
    }

    // 原有方法（getAllProducts、findProductById）保持不变
    public List<Product> getAllProducts() {
        return new ArrayList<>(productData.values());
    }

    public Product findProductById(String id) {
        return productData.get(id);
    }
}